package br.com.wepa.webapps.orca.logica.negocio.grupos;

import br.com.wepa.webapps.logger.TraceLogger;
import br.com.wepa.webapps.orca.logica.modelo.Grupo;
import br.com.wepa.webapps.orca.logica.negocio.BusinessException;
import br.com.wepa.webapps.orca.logica.negocio.facade.to.GrupoTO;
import br.com.wepa.webapps.orca.logica.persistencia.transaction.Transaction;

public class GruposManager  {	
	private static final TraceLogger logger = new TraceLogger(GruposManager.class);

	private GrupoBM grupoBM = new GrupoBM();
	private SubGrupoBM subGrupoBM = new SubGrupoBM();
	
	public GrupoTO setUp(GrupoTO to) throws BusinessException {
		logger.entering();
		if(to.ehNivelGrupo()){
			return grupoBM.setUp(to);
		}else if(to.ehNivelSubGrupo()){
			return subGrupoBM.setUp(to);
		}
		logger.exiting();
		return null;
	}
	
	
	
	/**
	 * seta no To o nivel de acordo com o tipo da Instancia do grupo
	 * @param to
	 * @param model
	 */
	public static void setNivelTO(GrupoTO to, Grupo grupo) {
		if (grupo.getClass().equals(NivelGrupo.SUBGRUPO.getConcreteClass())) {				
			to.setNivel(NivelGrupo.SUBGRUPO.getLabel());		
		}else if (grupo.getClass().equals(NivelGrupo.GRUPO.getConcreteClass())) {
			to.setNivel(NivelGrupo.GRUPO.getLabel());
		}
	}
	
	/**
	 * Pesquisa um grupo 
	 * @param to
	 * @return
	 * @throws BusinessException
	 */
	public GrupoTO find(GrupoTO to) throws BusinessException {		
		return GruposUtil.find(to);
	}
		
	@Transaction
	public GrupoTO persist(GrupoTO to) throws BusinessException {
		if(to.ehNivelGrupo()){
			return grupoBM.persist(to);
		}else if(to.ehNivelSubGrupo()){
			return subGrupoBM.persist(to);
		}
		return null;
	}
	
	/**
	 * Encontra os grupos por nivel
	 * @param to
	 * @return
	 * @throws BusinessException
	 */
	public GrupoTO findAllByNivel(GrupoTO to) throws BusinessException {		
		return GruposUtil.findAllByNivel(to);
	}

	/**
	 * Remove polimoficamente qualquer instancia do tipo Grupo
	 * @param to
	 * @throws BusinessException
	 */
	@Transaction
	public void remove(GrupoTO to) throws BusinessException {		
		grupoBM.remove(to);
	}
	/**
	 * Retorna todos grupos e sub tipos de grupo do sistema
	 * @return
	 * @throws BusinessException
	 */
	public GrupoTO findAll(GrupoTO to) throws BusinessException {
		to.addOrder("nome",true);
		to.addOrder("idGrupo",true);
		return grupoBM.findAll(to);
	}

	public GrupoTO load(GrupoTO to, boolean lock) throws BusinessException {		
		if(to.ehNivelGrupo()){
			return grupoBM.load(to,lock);
		}else if(to.ehNivelSubGrupo()){
			return subGrupoBM.load(to,lock);
		}
		return null;
	}

}
